<?php
namespace Zxf5115\Laravel\Local\Upload\Utils;

use Illuminate\Support\Facades\File;

/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * Base64资源上传工具类
 */
class Base64FileUtil
{
  /**
   * 获取上传文件响应内容方法
   *
   * @param string  $url 文件地址
   * @param string|bool $name 是否返回文件名
   * @return [type]
   */
  public static function getResourceData(string $url, string|bool $name = false)
  {
    return $name
           ? ['filename' => $name, 'url' => FileUtil::getCompleteUrl($url)]
           : FileUtil::getCompleteUrl($url);
  }


  /**
   * 获取base64文件内容
   *
   * @param string $file base64文件数据
   * @return [type]
   */
  public static function getFileData(string $file)
  {
    // 剥离base64的数据头
    $data = preg_replace('/^data:([a-zA-Z0-9\/\+\-\.]+);base64,/', '', $file);

    // 解析base64数据
    $data = base64_decode($data, true);

    return $data;
  }


  /**
   * 获取待保存文件名称方法
   *
   * @param [type] $data base64文件数据
   * @param [type] $extension base64文件类型
   * @return [type]
   */
  public static function getFileName($data, $extension)
  {
    // 计算文件哈希值
    $hash = self::getFileHash($data);

    // 组装新的文件名
    return $hash . '.' . $extension;
  }


  /**
   * 获取Base64文件大小方法
   *
   * @param [type] $file Base64文件内容
   * @return [type]
   */
  public static function getFileSize($file)
  {
    // Base64编码的大小约为原始数据的1.33倍
    $total = strlen(rtrim($file, '='));

    return intval($total * 3 / 4);
  }


  /**
   * 获取Base64文件媒体类型方法
   *
   * @param [type] $file Base64文件内容
   * @return [type]
   */
  public static function getFileMimeType($file)
  {
    preg_match('/^data:([a-zA-Z0-9\/\+\-\.]+);base64,/', $file, $data);

    return $data[1] ?? '';
  }


  /**
   * 获取base64文件类型方法
   *
   * @param [type] $mimeType base64文件媒体类型
   * @return [type]
   */
  public static function getFileExtension($mimeType)
  {
    $data = [
      'image/jpeg' => 'jpg',
      'image/jpg' => 'jpg',
      'image/png' => 'png',
      'image/gif' => 'gif',
      'image/svg+xml' => 'svg',
      'image/x-icon' => 'ico',
      'text/csv' => 'csv',
      'text/plain' => 'txt',
      'audio/mpeg' => 'mp3',
      'video/mp4' => 'mp4',
      'application/zip' => 'zip',
      'application/gzip' => 'gz',
      'application/vnd.rar' => 'rar',
      'application/x-sh' => 'sh',
      'application/pdf' => 'pdf',
      'application/msword' => 'doc',
      'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
      'application/vnd.ms-excel application/x-excel' => 'xls',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
      'application/octet-stream' => 'xlsx',
      'application/vnd.ms-powerpoint' => 'ppt',
      'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
    ];

    return $data[$mimeType] ?? '';
  }


  /**
   * 计算文件哈希值
   *
   * @param [type] $data base64文件数据
   * @return [type]
   */
  public static function getFileHash($data)
  {
    // 创建临时文件
    $file = tmpfile();

    if(!$file)
    {
      return false;
    }

    // 获取临时文件路径
    $path = stream_get_meta_data($file)['uri'];

    // 写入内容
    File::put($path, $data);

    $hash = File::hash($path);

    // 关闭文件但不删除
    fclose($file);

    return $hash;
  }
}
